package com.gkzf.ai.module.crm.util.extracted;

import com.gkzf.ai.module.crm.util.HtmlTempkateCommonMethod;
import com.gkzf.ai.module.crm.util.YearlyRecord;
import lombok.extern.slf4j.Slf4j;

import java.util.Collections;
import java.util.Map;
import java.util.Set;

import static com.gkzf.ai.module.crm.util.HtmlTempkateCommonMethod.determineTableFormat;

@Slf4j
public class ExtractedMatchContent {

    private static final Set<String> SWAP_TRIGGER_CHARS = Set.of("*","N", "C", "B", "M", "D", "Z","#");

    private  Extracted extracted;

    // 构造函数接收一个策略列表


    /**
     * 尝试使用不同的策略解析 HTML 表格，直到找到一个成功解析的策略。
     * @param tables 要解析的 HTML 表格 Elements。
     * @return 如果有策略成功解析并找到数据，返回结果 Map；如果所有策略都失败，返回一个空的 Map。
     */
    public Map<String, YearlyRecord> parseTables(String tables) {
        HtmlTempkateCommonMethod.TableFormat tableFormat = determineTableFormat(tables);
        switch (tableFormat) {
            case FORMAT1:
                extracted = new ParseTwoRowRepaymentTable();
                break;
            case FORMAT3:
                extracted = new ParseMonthlySegments();
                break;
            case FORMAT2:
                extracted = new ParseRepaymentTableData();
                break;
            default:
                log.info("未找到匹配的表格格式");
        }
        if (null == extracted){
            log.info("解析策略均未找到数据。");
            return Collections.emptyMap(); // 返回一个空的 Map 表示失败
        }
        // 调用当前策略的 parse 方法
        Map<String, YearlyRecord> result = extracted.extractedData(tables, SWAP_TRIGGER_CHARS);

        // 检查结果是否非空 (表示该策略成功解析并找到了数据)
        if (result != null && !result.isEmpty()) {
            log.info("成功使用策略: " + extracted.getClass().getSimpleName());
            return result; // 返回第一个成功策略的结果
        }
        // 如果结果为空，继续尝试下一个策略
        log.info("策略 " + extracted.getClass().getSimpleName() + " 未找到数据，尝试下一个策略...");

        return Collections.emptyMap(); // 返回一个空的 Map 表示失败
    }


    public static void main(String[] args) {
        ExtractedMatchContent extractedMatchContent = new ExtractedMatchContent();
        String table = "<table>\n" +
                "<tr><td></td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td><td>11</td><td>12</td></tr>\n" +
                "<tr><td>2024</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td></tr>\n" +
                "<tr><td>2023</td><td>N<br>0</td><td>1<br>1,281</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td><td>N<br>0</td></tr>\n" +
                "</table>";

        Map<String, YearlyRecord> stringYearlyRecordMap = extractedMatchContent.parseTables(table);
        log.info(stringYearlyRecordMap.toString());
    }

}
